www.gusucode.com > VC++ 打飞机游戏-源码程序 > VC++ 打飞机游戏-源码程序\code\src\FighterInfo.cpp
//Download by http://www.NewXing.com // FighterInfo.cpp : implementation file // #include "stdafx.h" #include "Fighter.h" #include "FighterInfo.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CFighterInfo CFighterInfo::CFighterInfo() { } CFighterInfo::~CFighterInfo() { } ///////////////////////////////////////////////////////////////////////////// // CFighterInfo message handlers void CFighterInfo::SetHeadPos(CPoint ptPos) { m_ptHeadPos = ptPos; } BOOL CFighterInfo::SetFighterPosition(int nDir) { switch(nDir){ case 0: m_ptPos[0] = m_ptHeadPos; m_ptPos[1] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-2); m_ptPos[2] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-1); m_ptPos[3] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y ); m_ptPos[4] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+1); m_ptPos[5] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+2); m_ptPos[6] = CPoint(m_ptHeadPos.x-2, m_ptHeadPos.y ); m_ptPos[7] = CPoint(m_ptHeadPos.x-3, m_ptHeadPos.y-1); m_ptPos[8] = CPoint(m_ptHeadPos.x-3, m_ptHeadPos.y ); m_ptPos[9] = CPoint(m_ptHeadPos.x-3, m_ptHeadPos.y+1); break; case 1: m_ptPos[0] = m_ptHeadPos; m_ptPos[1] = CPoint(m_ptHeadPos.x+2, m_ptHeadPos.y-1); m_ptPos[2] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-1); m_ptPos[3] = CPoint(m_ptHeadPos.x , m_ptHeadPos.y-1); m_ptPos[4] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-1); m_ptPos[5] = CPoint(m_ptHeadPos.x-2, m_ptHeadPos.y-1); m_ptPos[6] = CPoint(m_ptHeadPos.x , m_ptHeadPos.y-2); m_ptPos[7] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-3); m_ptPos[8] = CPoint(m_ptHeadPos.x , m_ptHeadPos.y-3); m_ptPos[9] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-3); break; case 2: m_ptPos[0] = m_ptHeadPos; m_ptPos[1] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+2); m_ptPos[2] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+1); m_ptPos[3] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y ); m_ptPos[4] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-1); m_ptPos[5] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-2); m_ptPos[6] = CPoint(m_ptHeadPos.x+2, m_ptHeadPos.y ); m_ptPos[7] = CPoint(m_ptHeadPos.x+3, m_ptHeadPos.y+1); m_ptPos[8] = CPoint(m_ptHeadPos.x+3, m_ptHeadPos.y ); m_ptPos[9] = CPoint(m_ptHeadPos.x+3, m_ptHeadPos.y-1); break; case 3: m_ptPos[0] = m_ptHeadPos; m_ptPos[1] = CPoint(m_ptHeadPos.x-2, m_ptHeadPos.y+1); m_ptPos[2] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+1); m_ptPos[3] = CPoint(m_ptHeadPos.x , m_ptHeadPos.y+1); m_ptPos[4] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+1); m_ptPos[5] = CPoint(m_ptHeadPos.x+2, m_ptHeadPos.y+1); m_ptPos[6] = CPoint(m_ptHeadPos.x , m_ptHeadPos.y+2); m_ptPos[7] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+3); m_ptPos[8] = CPoint(m_ptHeadPos.x , m_ptHeadPos.y+3); m_ptPos[9] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+3); break; default: break; } for(int i=0; i<10; i++) if(m_ptPos[i].x<0 || m_ptPos[i].y<0 || m_ptPos[i].x>9 || m_ptPos[i].y>9) return FALSE; return TRUE; } ////////////////////////////////////////////////////// //检查m_nSky[10][10]中的布局是否正确 // // /////////////////////////////////////////////////////// BOOL CFighterInfo::IsFighterValid() { for(int i=0; i<10; i++){ if(m_ptPos[i].x<0 || m_ptPos[i].x>9) return FALSE; if(m_ptPos[i].y<0 || m_ptPos[i].y>9) return FALSE; if(m_nSky[m_ptPos[i].x][m_ptPos[i].y] == 1) return FALSE; if(m_nSky[m_ptPos[i].x][m_ptPos[i].y] == 2) return FALSE; } return TRUE; } BOOL CFighterInfo::IsSkyValid() { int i=0, j=0, k=0, l=0; int nSky[10][10]; CPoint ptHead[3]; int nHead=0; for(i=0; i<10; i++) for(j=0; j<10; j++) { if(m_nSky[i][j] == 2) ptHead[nHead++] = CPoint(i, j); nSky[i][j] = 0; } if(nHead!=3) return FALSE; int nTotal=0; for(i=0; i<10; i++) for(j=0; j<10; j++) nTotal += m_nSky[i][j]; if(nTotal!=33) return FALSE; int nx=0, ny=0; char buf[256]; CPoint ptPos2[10];//第二层的循环的m_ptPos[10]需要保留,若第三层检验不成功要减去 BOOL bInterrupted = FALSE; for(i=0; i<4; i++)//第一层循环 { for(nx=0; nx<10; nx++) for(ny=0; ny<10; ny++) nSky[nx][ny]=0; SetHeadPos(ptHead[0]); if(!SetFighterPosition(i)) continue; int temp = ptHead[0].x; temp = ptHead[0].y; for(l=0; l<10; l++) nSky[m_ptPos[l].x][m_ptPos[l].y] += 1; sprintf(buf, "i=%d\r\n", i); //PrintSky(nSky, buf); for(j=0; j<4; j++)//第二层循环 { SetHeadPos(ptHead[1]); if(!SetFighterPosition(j)) continue; for(l=0; l<10; l++) { nSky[m_ptPos[l].x][m_ptPos[l].y] += 1; ptPos2[l] = m_ptPos[l];//保留第二层的m_ptPos } sprintf(buf, "i=%d j=%d\r\n", i, j); //PrintSky(nSky, buf); bInterrupted = FALSE; for(nx=0; nx<10; nx++) { for(ny=0; ny<10; ny++) if(nSky[nx][ny]==2) //如果为2,说明飞机有重叠,重新第二层循环 { for(l=0; l<10; l++) nSky[ptPos2[l].x][ptPos2[l].y] -= 1; bInterrupted = TRUE; break; } if(bInterrupted) break; } if(bInterrupted) continue; for(k=0; k<4; k++)//第三层循环 { SetHeadPos(ptHead[2]); if(!SetFighterPosition(k)) continue; for(l=0; l<10; l++) nSky[m_ptPos[l].x][m_ptPos[l].y] += 1; sprintf(buf, "(before check)i=%d j=%d k=%d\r\n", i, j, k); //PrintSky(nSky, buf); bInterrupted = FALSE; for(nx=0; nx<10; nx++) { for(ny=0; ny<10; ny++) if(nSky[nx][ny]==2) //如果为2,说明飞机有重叠,重新第三层循环 { for(l=0; l<10; l++) nSky[m_ptPos[l].x][m_ptPos[l].y] -= 1; bInterrupted = TRUE; break; } if(bInterrupted) break; } if(bInterrupted) continue; sprintf(buf, "(通过测试)i=%d j=%d k=%d\r\n", i, j, k); //PrintSky(nSky, buf); BOOL bMatched = TRUE; for(int nRow=0; nRow<10; nRow++) { for(int nColumn=0; nColumn<10; nColumn++) { if((m_nSky[nRow][nColumn]!=2) &&(nSky[nRow][nColumn] != m_nSky[nRow][nColumn])) { bMatched = FALSE; break; } } if(!bMatched) break; } if(bMatched) return TRUE; for(l=0; l<10; l++) nSky[m_ptPos[l].x][m_ptPos[l].y] -= 1; } for(l=0; l<10; l++) nSky[ptPos2[l].x][ptPos2[l].y] -= 1; } } sprintf(buf, "leave: i=%d j=%d k=%d\r\n", i, j, k); //PrintSky(m_nSky, buf); return FALSE; } void CFighterInfo::SetItInSky() { m_nSky[m_ptPos[0].x][m_ptPos[0].y] = 2; for(int i=1; i<10; i++){ m_nSky[m_ptPos[i].x][m_ptPos[i].y] = 1; } } CPoint CFighterInfo::GetHeadPos() { return m_ptHeadPos; } void CFighterInfo::PrintSky(int nSky[10][10], LPCTSTR buf) { CStdioFile file; if(!file.Open("g:\\sky.txt", CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite)) { AfxMessageBox("open sky.txt fail"); return ; } CString info; int temp; file.Seek(0, CFile::end); file.WriteString(buf); for(int j=0; j<10; j++) { for(int i=0; i<10; i++) { temp = nSky[i][j]; info.Format("%d ", nSky[i][j]); file.WriteString(info); } file.WriteString("\r\n"); } file.Close(); }